package com.cspm.common.util;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;

/**
 * 文件上传工具类
 *
 * @author CHENQUAN
 * @date 2016年9月8日
 */
public class UploadFileUtil {

    /**
     * 路径间隔符
     */
    public static String fileSeparator = System.getProperty("file.separator");

    /**
     * HTTP上传文件，用上传文件
     *
     * @param request 请求对象
     * @param path    带文件名存放路径，项目相对路径
     * @param path    带文件名存放路径，项目相对路径
     * @return 返回文件URL
     * @author CHENQUAN
     * @date 2016年9月8日
     */
    public static String uploadFile(HttpServletRequest request, String path) {
        String fileName = null;
        // 创建一个通用的多部分解析器
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        // 判断 request 是否有文件上传,即多部分请求
        if (multipartResolver.isMultipart(request)) {
            // 转换成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            // 取得request中的所有文件名
            Iterator<String> iter = multiRequest.getFileNames();
            while (iter.hasNext()) {
                // 取得上传文件
                MultipartFile file = multiRequest.getFile(iter.next());
                if (file != null) {
                    // 取得当前上传文件的文件名称
                    String myFileName = file.getOriginalFilename();
                    // 如果名称不为“”,说明该文件存在，否则说明该文件不存在
                    if (!myFileName.trim().equals("")) {
                        // 项目绝对路径
                        String projectAbsPath = request.getSession()
                                .getServletContext().getRealPath("");
                        // 重命名上传后的文件名
                        fileName = getFileName()
                                + myFileName.substring(myFileName
                                .lastIndexOf("."));
                        // 文件相对路径
                        String relativePath = path + getFilePath();
                        // 定义上传路径不带文件名
                        String uploadPath = projectAbsPath + relativePath;
                        if (!new File(uploadPath).exists()) {
                            UploadFileUtil.createDir(uploadPath);
                        }
                        File localFile = new File(uploadPath + fileName);
                        try {
                            file.transferTo(localFile);
                            // 将文件相对路径转换为URL路径
                            fileName = relativePath + fileName;
                            fileName = fileName.replaceAll("\\\\", "/");
                        } catch (IllegalStateException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        return fileName;
    }

    /**
     * 生成不重复文件名，不包含后缀名，格式为带毫秒时间戳加四位随机码：如：20160923171542822APER
     *
     * @return 不重复文件名
     * @author CHENQUAN
     * @date 2016年11月1日
     */
    public static String getFileName() {
        return DateUtil.dateToString(new Date(), DateUtil.DATE_MILLI_PATTERN)
                + VerifyCodeUtil.generateVerifyCode(4);
    }

    /**
     * 生成文件路径
     *
     * @return 相对路径。如：\\2016\\10\\11\\
     * @author CHENQUAN
     * @date 2016年11月1日
     */
    public static String getFilePath() {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return fileSeparator + year + fileSeparator + month + fileSeparator
                + day + fileSeparator;
    }

    /**
     * 创建路径
     *
     * @param destDirName 路径
     * @return 检查路径是否存在，若不存在则创建路径
     * @author CHENQUAN
     * @date 2016年11月1日
     */
    public static boolean createDir(String destDirName) {
        File dir = new File(destDirName);
        if (dir.exists()) {
            return false;
        }
        if (!destDirName.endsWith(fileSeparator)) {
            destDirName = destDirName + fileSeparator;
        }
        // 创建目录
        if (dir.mkdirs()) {
            return true;
        } else {
            System.out.println("创建目录" + destDirName + "失败！");
            return false;
        }
    }

    public static void main(String[] args) {
        System.out.println(fileSeparator);
        System.out.println(File.separator);
    }
}
